/*******************************************************************************
* Copyright (c) 2014, 2017 Obeo and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.menus;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.equinox.log.ExtendedLogReaderService;
import org.eclipse.equinox.log.LogFilter;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.tests.harness.util.UITestCase;
import org.osgi.service.log.LogListener;
import org.osgi.service.log.LogService;
/**
* @author Maxime Porhel
*/
public class Bug410426Test extends UITestCase {
public Bug410426Test(String testName) {
super(testName);
}
public void testToolbarContributionFromFactoryVisibility() throws Exception {
IWorkbenchWindow window = openTestWindow();
IMenuService menus = window.getService(IMenuService.class);
ToolBarManager manager = new ToolBarManager();
try {
// populate contribution
populateTestToolbar(menus, manager);
// check the contributions and their visibility
IContributionItem[] items = manager.getItems();
assertEquals(6, items.length);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_ITEM_WITHOUT_VISIBLE_WHEN, items, true);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_ITEM_WITH_ALWAYS_TRUE_VISIBLE_WHEN, items, true);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_ITEM_WITH_ALWAYS_FALSE_VISIBLE_WHEN, items, false);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_MENU_MANAGER_WITHOUT_VISIBLE_WHEN, items, true);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_MENU_MANAGER_WITH_ALWAYS_TRUE_VISIBLE_WHEN, items, true);
checkItem(DeclaredProgrammaticFactoryForToolbarVisibilityTest.TEST_ITEM_WITH_ALWAYS_FALSE_VISIBLE_WHEN, items, false);
// now get the tool items
ToolBar toolBar = manager.createControl(window.getShell());
manager.update(true);
ToolItem[] toolItems = toolBar.getItems();
assertEquals("Only four tool items should be created as there are four visible contributions on the six contributions:", 4, toolItems.length); //$NON-NLS-N$
} finally {
menus.releaseContributions(manager);
}
}
private void populateTestToolbar(IMenuService menus, ToolBarManager manager) {
menus.populateContributionManager(manager, "toolbar:org.eclipse.ui.tests.toolbarContributionFromFactoryVisibilityTest"); //$NON-NLS-N$
}
private void checkItem(String id, IContributionItem[] items, boolean expectedVisibility) {
IContributionItem item = getItemWithId(id, items);
assertNotNull(item);
assertEquals("The contribution item with id '" + id + "' has not the expected vibility:", expectedVisibility, item.isVisible()); //$NON-NLS-N$
}
private IContributionItem getItemWithId(String id, IContributionItem[] items) {
for (IContributionItem item : items) {
if (id.equals(item.getId())) {
return item;
}
}
return null;
}
public void testNoClassCastExceptionForMenuManagerToolbarContribution() throws Exception {
IWorkbenchWindow window = openTestWindow();
IMenuService menus = window.getService(IMenuService.class);
ToolBarManager manager = new ToolBarManager();
//Add a log listener to detect the corrected ClassCastException in bug 410426.
final List<ClassCastException> cces = new ArrayList<>();
ExtendedLogReaderService log = window
.getService(ExtendedLogReaderService.class);
LogListener logListener = entry -> {
if (entry.getLevel() == LogService.LOG_ERROR && entry.getException() instanceof ClassCastException
&& entry.getException().getMessage()
.contains("MenuManager cannot be cast to org.eclipse.jface.action.ContributionItem")) { // $NON-NLS-N$
cces.add((ClassCastException) entry.getException());
}
};
LogFilter logFilter = (bundle, loggerName, logLevel) -> logLevel == LogService.LOG_ERROR && loggerName == null
&& "org.eclipse.equinox.event".equals(bundle.getSymbolicName());
log.addLogListener(logListener, logFilter);
try {
populateTestToolbar(menus, manager);
assertTrue("We should not get these 'MenuManager cannot be cast to org.eclipse.jface.action.ContributionItem' ClassCastException.", cces.isEmpty()); //$NON-NLS-N$
// check the contributions count.
IContributionItem[] items = manager.getItems();
assertEquals(6, items.length);
} finally {
menus.releaseContributions(manager);
log.removeLogListener(logListener);
cces.clear();
}
}
}